#ifndef ___fat32_transacciones_funciones_auxiliares_3

#define ___fat32_transacciones_funciones_auxiliares_3 1

#include "f32_bloq.c"
#include "f32_acon.c"
#include "f32_dles.c"
#include "f32_base.c"
#include "f32_rb_1.c"
#include "f32_rbda.c"

int fat32_procesar_bloqueo_lectura(fat32_bloqueo *);
int fat32_procesar_bloqueo_escritura(fat32_bloqueo *);
int fat32_procesar_bloqueo_acceso(fat32_bloqueo *);
int fat32_procesar_bloqueo_conexion(fat32_bloqueo *);
int fat32_procesar_bloqueo_apertura(fat32_bloqueo *);

int fat32_procesar_bloqueo_lectura (fat32_bloqueo * bloqueo) {
  unsigned int posicion;
  for (posicion = 0; posicion < fat32_cantidad_operaciones_terminadas; posicion ++)
    if ((!fat32_operaciones_terminadas[posicion].operacion) &&
        (fat32_operaciones_terminadas[posicion].transaccion == (bloqueo -> transaccionBloqueada)) &&
        (fat32_operaciones_terminadas[posicion].sector == (bloqueo -> datosEvento).lectura.sector)) {
      fat32_cantidad_operaciones_terminadas --;
      fat32_operaciones_terminadas[posicion] = fat32_operaciones_terminadas[fat32_cantidad_operaciones_terminadas]
      fat32_operaciones_terminadas = fb_cambiar_tamano(fat32_operaciones_terminadas, sizeof(fat32_operacion_terminada),
                                                                                 fat32_cantidad_operaciones_terminadas);
      bloqueo -> tipoEvento = 0;
      return 1;
    }
  return 0;
}

int fat32_procesar_bloqueo_escritura (fat32_bloqueo * bloqueo) {
  unsigned int posicion;
  for (posicion = 0; posicion < fat32_cantidad_operaciones_terminadas; posicion ++)
    if ((fat32_operaciones_terminadas[posicion].operacion) &&
        (fat32_operaciones_terminadas[posicion].transaccion == (bloqueo -> transaccionBloqueada)) &&
        (fat32_operaciones_terminadas[posicion].sector == (bloqueo -> datosEvento).lectura.sector)) {
      fat32_cantidad_operaciones_terminadas --;
      fat32_operaciones_terminadas[posicion] = fat32_operaciones_terminadas[fat32_cantidad_operaciones_terminadas]
      fat32_operaciones_terminadas = fb_cambiar_tamano(fat32_operaciones_terminadas, sizeof(fat32_operacion_terminada),
                                                                                 fat32_cantidad_operaciones_terminadas);
      bloqueo -> tipoEvento = 0;
      return 1;
    }
  return 0;
}

int fat32_procesar_bloqueo_acceso (fat32_bloqueo * bloqueo) {
  unsigned long long numDescriptor = (bloqueo -> datosEvento).archivo.descriptor;
  unsigned char nivel = (bloqueo -> datosEvento).archivo.nivel;
  fat32_descriptor_archivo * descriptor = fat32_buscar_descriptor(numDescriptor);
  unsigned char bloqueoActual = fat32_obtener_bloqueo_sobre_elemento(numDescriptor);
  if (bloqueoActual && !(
       ((bloqueoActual == 1) && (nivel == 1)) || (((bloqueoActual == 4) || (bloqueoActual == 5)) && ((nivel == 4) || (nivel == 5)))
     ))
    return 0;
  fat32_generar_nueva_apertura_para_elemento(bloqueo -> transaccionBloqueada, numDescriptor, nivel);
  bloqueo -> tipoEvento = 0;
  return 1;
}

int fat32_procesar_bloqueo_conexion (fat32_bloqueo * bloqueo) {
  unsigned int conexion = fat32_obtener_conexion_disponible();
  if (conexion) bloqueo -> tipoEvento = 0;
  return conexion;
}

int fat32_procesar_bloqueo_apertura (fat32_bloqueo * bloqueo) {
  fat32_datos_apertura da = (bloqueo -> datosEvento).apertura;
  unsigned long long numDescriptor = da.descriptor;
  unsigned char nivel = (da.modo) ? FAT32_BLOQUEO_ARCHIVO_ESCRITURA : FAT32_BLOQUEO_ARCHIVO_LECTURA;
  fat32_descriptor_archivo * descriptor = fat32_buscar_descriptor(numDescriptor);
  unsigned char bloqueoActual = fat32_obtener_bloqueo_sobre_elemento(numDescriptor);
  if (bloqueoActual && !(
       ((bloqueoActual == 1) && (nivel == 1)) || (((bloqueoActual == 4) || (bloqueoActual == 5)) && ((nivel == 4) || (nivel == 5)))
     ))
    return 0;
  fat32_abrir_elemento(bloqueo -> transaccionBloqueada, da);
  bloqueo -> tipoEvento = 0;
  return 1;
}

#endif